package slent.iespana.es.Quimica.TablaPeriodica.VentanaTablaPeriodica;

import es.iespana.slent.tablaperiodica.*;
import javax.xml.bind.*;
import javax.swing.*;
import java.util.*;
import java.io.*;

/**
 * Created by IntelliJ IDEA.
 * User: slent
 * Date: 10/01/2010
 * Time: 09:57:31 PM
 * Esta clase se encarga de la creación de una tabla periódica por default,
 * sirve en caso de querer reestablecer los valores de la tabla para el sistema
 */
public class TablaPeriodicaDefault {
    private ObjectFactory creadorTablaPeriodica;
    private TablaPeriodica tablaPeriodica;

    public TablaPeriodicaDefault() {
        creadorTablaPeriodica = new ObjectFactory();
        tablaPeriodica = creadorTablaPeriodica.createTablaPeriodica();
    }

    /**
     * Se encarga de crear la tabla con sus elementos
     */
    public void crearTabla() {
        TablaPeriodica.Elemento h = creadorTablaPeriodica.createTablaPeriodicaElemento();
        h.setNombre("Hidrógeno");
        h.setNumeroAtomico(1);
        h.setSimbolo("H");
        tablaPeriodica.getElemento().add(h);

        TablaPeriodica.Elemento he = creadorTablaPeriodica.createTablaPeriodicaElemento();
        he.setNombre("Helio");
        he.setNumeroAtomico(2);
        he.setSimbolo("He");
        tablaPeriodica.getElemento().add(he);

        TablaPeriodica.Elemento li = creadorTablaPeriodica.createTablaPeriodicaElemento();
        li.setNombre("Lithio");
        li.setNumeroAtomico(3);
        li.setSimbolo("Li");
        tablaPeriodica.getElemento().add(li);

        TablaPeriodica.Elemento be = creadorTablaPeriodica.createTablaPeriodicaElemento();
        be.setNombre("Berilio");
        be.setNumeroAtomico(4);
        be.setSimbolo("Be");
        tablaPeriodica.getElemento().add(be);

        TablaPeriodica.Elemento b = creadorTablaPeriodica.createTablaPeriodicaElemento();
        b.setNombre("Boro");
        b.setNumeroAtomico(5);
        b.setSimbolo("B");
        tablaPeriodica.getElemento().add(b);

        TablaPeriodica.Elemento c = creadorTablaPeriodica.createTablaPeriodicaElemento();
        c.setNombre("Carbono");
        c.setNumeroAtomico(6);
        c.setSimbolo("C");
        tablaPeriodica.getElemento().add(c);

        TablaPeriodica.Elemento n = creadorTablaPeriodica.createTablaPeriodicaElemento();
        n.setNombre("Nitrogeno");
        n.setNumeroAtomico(7);
        n.setSimbolo("N");
        tablaPeriodica.getElemento().add(n);

        TablaPeriodica.Elemento o = creadorTablaPeriodica.createTablaPeriodicaElemento();
        o.setNombre("Oxigeno");
        o.setNumeroAtomico(8);
        o.setSimbolo("O");
        tablaPeriodica.getElemento().add(o);

        TablaPeriodica.Elemento f = creadorTablaPeriodica.createTablaPeriodicaElemento();
        f.setNombre("Fluor");
        f.setNumeroAtomico(9);
        f.setSimbolo("F");
        tablaPeriodica.getElemento().add(f);

        TablaPeriodica.Elemento ne = creadorTablaPeriodica.createTablaPeriodicaElemento();
        ne.setNombre("Neon");
        ne.setNumeroAtomico(10);
        ne.setSimbolo("Ne");
        tablaPeriodica.getElemento().add(ne);

        TablaPeriodica.Elemento na = creadorTablaPeriodica.createTablaPeriodicaElemento();
        na.setNombre("Sodio");
        na.setNumeroAtomico(11);
        na.setSimbolo("Na");
        tablaPeriodica.getElemento().add(na);

        TablaPeriodica.Elemento mg = creadorTablaPeriodica.createTablaPeriodicaElemento();
        mg.setNombre("Magnesio");
        mg.setNumeroAtomico(12);
        mg.setSimbolo("Mg");
        tablaPeriodica.getElemento().add(mg);
    }

    /**
     * Se encarga de cargar la tabla periódca desde un archivo XML
     */
    public void cargarTablaPeriodica() {
        String carpetaUsuario = System.getProperty("user.home");
        File carpetaPrograma = new File(carpetaUsuario + File.separator + "flaquimica");
        File archivo = new File(carpetaPrograma + File.separator + "tablaperiodica.xml");
        if (!archivo.exists())
            System.out.println("El archivo " + archivo.getName() + " no existe");
        else {
            //cargamos desde ese archivo
            try {
                JAXBContext ctx = JAXBContext.newInstance(TablaPeriodica.class.getPackage().getName());
                Unmarshaller u = ctx.createUnmarshaller();
                JAXBElement rootTabla = (JAXBElement)u.unmarshal(archivo);
                tablaPeriodica = (TablaPeriodica)rootTabla.getValue();
            } catch (JAXBException jbe) {
                System.out.println("Error en la creacion de la tabla periodica. " + jbe.getMessage());
            }
        }
    }

    public void guardarEnArchivo() {
        String carpetaUsuario = System.getProperty("user.home");
        File carpetaPrograma = new File(carpetaUsuario + File.separator + "flaquimica");
        System.out.println(carpetaUsuario);
        System.out.println(carpetaPrograma);
        if (!carpetaPrograma.exists()) {
            if (carpetaPrograma.mkdir()) {
            } else { //erroe al crear el directorio
                JOptionPane.showMessageDialog(null, "Error al crear la carpeta del sistema");
            }
        }

        try {
            JAXBContext ctx = JAXBContext.newInstance(TablaPeriodica.class.getPackage().getName());
            Marshaller m = ctx.createMarshaller();
            m.setProperty("jaxb.formatted.output", true);
            File archivo = new File(carpetaPrograma + File.separator + "tablaperiodica.xml");
            if (archivo.createNewFile())
                System.out.println("archivo creado");
            m.marshal(creadorTablaPeriodica.createTablaPeriodica(tablaPeriodica), new FileOutputStream(archivo));
        } catch (JAXBException jex) {
            System.out.println("error de interpretación JAXB. " + jex.getMessage());
        } catch (IOException ioe) {
            System.out.println("Error al escribir en el archivo. " + ioe.getMessage());
        }
    }

    public TablaPeriodica getTablaPeriodica() {
        return tablaPeriodica;
    }

    public void setTablaPeriodica(TablaPeriodica tablaPeriodica) {
        this.tablaPeriodica = tablaPeriodica;
    }

    public static void main(String[] args) {
        TablaPeriodicaDefault tablaDeault = new TablaPeriodicaDefault();
        tablaDeault.crearTabla();
        tablaDeault.guardarEnArchivo();
    }
}